﻿/*
 * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2023-2023. All rights reserved.
 */

#include <openssl/aes.h>
#include "Global.h"
#include "../platform/Securec/secinput.h"
#include "AESUtils.h"


AESUtilsClass::AESUtils::AESUtils()
{
}
AESUtilsClass::AESUtils::~AESUtils()
{
}

int AESUtilsClass::AESUtils::DecryptTLVData(BYTE* key, BYTE* data, DWORD dataLen, BYTE* out) const
{
    AES_KEY aes;

    // iv 的长度要与 key的长度保持一致，可约定长度为16
    BYTE aeskey[AES_BLOCK_SIZE] = {0};
    if (memcpy_s(aeskey, AES_BLOCK_SIZE, key, AES_BLOCK_SIZE) != EOK) {
        return 0;
    }
    BYTE iv[AES_BLOCK_SIZE] = {0};
    if (memcpy_s(iv, AES_BLOCK_SIZE, key + AES_BLOCK_SIZE, AES_BLOCK_SIZE) != EOK) {
        return 0;
    }
    // userKey	用户指定的密码。注意：只能是16、24、32字节。如果密码字符串长度不够，可以在字符串末尾追加一些特定的字符，或者重复密码字符串，直到满足最少的长度。
    // bits	密码位数。即userKey的长度 * 8，只能是128、192、256位。
    // key	向外输出参数。
    if (AES_set_decrypt_key(aeskey, 128, &aes) < 0) { // 密码位数为 128位
        printf("Error: AES_set_decrypt_key");
        return -1;
    }
    // in	输入数据。长度任意。
    // out	输出数据。能够容纳下输入数据，且长度必须是16字节的倍数。
    // length	输入数据的实际长度。
    // key	使用AES_set_encrypt / decrypt_key生成的Key。
    // ivec	可读写的一块内存。长度必须是16字节。
    // enc	是否是加密操作。AES_ENCRYPT表示加密，AES_DECRYPT表示解密。
    AES_cbc_encrypt(data, out, dataLen, &aes, iv, AES_DECRYPT);
    int retSet = memset_s(aeskey, AES_BLOCK_SIZE, 0, AES_BLOCK_SIZE);
    if (retSet != 0) {
        return 0;
    }
    retSet = memset_s(iv, AES_BLOCK_SIZE, 0, AES_BLOCK_SIZE);
    if (retSet != 0) {
        return 0;
    }
    return 0;
}
